﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Collections;
using System.Globalization;
using System.Net.Mail;

namespace FlyShop
{
    public partial class FrmCadastroCliente : Form
    {
        // Indica se o form está em modo de edição
        public bool edicao = false;

        // Código do registro a ser alterado
        public int codCliente = 0;

        // Recebe e guarda próximo cod_endereco do BD
        int codProximoEndereco;

        // Recebe e guarda próximo cod_endereco do BD
        int codProximaPessoa;

        // Flag Cliente Especial e flag para receber Marketing
        char flagEspecial, flagMarketing;

        // Salva o cod end para edição
        string editacodend;

        // Salva temporariamente os telefones e checa para conferir se na edição precisa ser alterado, inserido ou deletado.
        string telRes, telCom, telCel;
        bool bTelRes = false, bTelCom = false, bTelCel = false;

        OleDbConnection conexao;
        OleDbCommand comando;
        OleDbDataReader dr, drCidade;
        String strConexao = "Provider=MSDAORA;Data Source=localhost;User ID=pi;Password=pi";
        String sqlConsultacod_end = "select endereco_seq.nextval from dual";
        String sqlConsultacod_pessoa = "select pessoa_seq.nextval from dual";
        String sqlConsulta = "select cid.uf ,e.logradouro, e.numero, e.cep, e.cod_cidade, e.complemento, p.cod_pessoa, p.nome, p.tipo, p.sexo, p.cpf, p.data_nascimento, p.email, p.cod_endereco, cli.ocupacao, cli.renda, cli.flag_especial, cli.flag_marketing from cidade cid, endereco e, pessoa p, cliente cli where cid.cod_cidade = e.cod_cidade and p.cod_endereco = e.cod_endereco and p.cod_pessoa = cli.cod_pessoa and p.cod_pessoa = ?";
        String sqlConsultaTel1 = "select t.numero, t.tipo, t.cod_pessoa from telefone t, pessoa p where t.cod_pessoa = p.cod_pessoa and p.cod_pessoa = ? and t.tipo = 1";
        String sqlConsultaTel2 = "select t.numero, t.tipo, t.cod_pessoa from telefone t, pessoa p where t.cod_pessoa = p.cod_pessoa and p.cod_pessoa = ? and t.tipo = 2";
        String sqlConsultaTel3 = "select t.numero, t.tipo, t.cod_pessoa from telefone t, pessoa p where t.cod_pessoa = p.cod_pessoa and p.cod_pessoa = ? and t.tipo = 3";
        String sqlInsereend = "insert into endereco (cod_endereco, logradouro, numero, cep, cod_cidade, complemento) values (?, ?, ?, ?, ?, ?)";
        String sqlInserepessoa = "insert into pessoa (cod_pessoa, nome, tipo, sexo, cpf, data_nascimento, email, cod_endereco) values (?, ?, ?, ?, ?, ?, ?, ?)";
        String sqlInsereTel = "insert into telefone (numero, tipo, cod_pessoa) values (?, ?, ?)";
        String sqlInsereCliente = "insert into cliente (cod_pessoa, ocupacao, renda, flag_especial, flag_marketing) values (?, ?, ?, ?, ?)";
        String sqlUpdateEndereco = "update endereco set logradouro = ?, numero = ?, cep = ?, cod_cidade = ?, complemento = ? where cod_endereco = ?";
        String sqlUpdateCliente = "update cliente set ocupacao = ?, renda = ?, flag_especial = ?, flag_marketing = ? where cod_pessoa = ?";
        String sqlUpdateTel = "update telefone set numero = ?, tipo = ? where cod_pessoa = ?";
        String sqlUpdatePessoa = "update pessoa set nome = ?, sexo = ?, cpf = ?, data_nascimento = ?, email = ? where cod_pessoa = ?";
        String sqlConsultaCidadesDoUf = "select * from cidade where uf = ? order by nome";
        //String sqlConsultaPessoaCPF = "select * from pessoa where cpf = ?";
        OleDbParameter pCod_endereco, pLogradouro, pNumero, pCep, pCod_cidade, pComplemento, pTels;
        OleDbParameter pCod_pessoa, pNomepessoa, pTipo, pSexo, pCpf, pData_Nascimento, pEmail, pCod_enderecofk;
        OleDbParameter pNumerotel, pNumeroCom, pNumeroCel, pTipoTel, pCod_pessoafktel, pCod_pessoaCliente, pOcupacao, pRenda, pFlag_especial, pFlag_marketing;

        public FrmCadastroCliente()
        {
            InitializeComponent();
        }

        private void FrmCadastroCliente_Load(object sender, EventArgs e)
        {
            // Estabelece conexão com o bando de dados
            conexao = new OleDbConnection(strConexao);
            conexao.Open();

            dtpNascimento.MaxDate = DateTime.Now.AddYears(-10);
            

            if (edicao)
            {
                //Se estiver em modo de edição

                //Popula telefone Residencial
                comando = new OleDbCommand(sqlConsultaTel1, conexao);

                pTels = new OleDbParameter("cod_telefone", OleDbType.Integer);
                pTels.Value = codCliente;
                comando.Parameters.Add(pTels);

                dr = comando.ExecuteReader();
                if (dr.Read())
                {
                    mtbTelres.Text = dr["NUMERO"].ToString();
                }

                //Popula telefone Comercial
                comando = new OleDbCommand(sqlConsultaTel2, conexao);

                pTels = new OleDbParameter("cod_telefone", OleDbType.Integer);
                pTels.Value = codCliente;
                comando.Parameters.Add(pTels);

                dr = comando.ExecuteReader();
                if (dr.Read())
                {
                    mtbTelcom.Text = dr["NUMERO"].ToString();
                }

                //Popula telefone Celular
                comando = new OleDbCommand(sqlConsultaTel3, conexao);

                pTels = new OleDbParameter("cod_telefone", OleDbType.Integer);
                pTels.Value = codCliente;
                comando.Parameters.Add(pTels);

                dr = comando.ExecuteReader();
                if (dr.Read())
                {
                    mtbTelcel.Text = dr["NUMERO"].ToString();
                }
                
                //Recebe os telefones nas variáveis para comparar mudanças
                telRes = mtbTelres.Text;
                telCom = mtbTelcom.Text;
                telCel = mtbTelcel.Text;

                //Verifica se na edição os telefones são nulos e precisam ser inseridos.
                if (telRes == "")
                    bTelRes = true;
                if (telCom == "")
                    bTelCom = true;
                if (telCel == "")
                    bTelCel = true;

                //Popula o restante dos campos
                comando = new OleDbCommand(sqlConsulta, conexao);

                pCod_pessoa = new OleDbParameter("cod_pessoa", OleDbType.Integer);
                pCod_pessoa.Value = codCliente;
                comando.Parameters.Add(pCod_pessoa);

                dr = comando.ExecuteReader();

                if (dr.Read())
                {
                    tbNome.Text = dr["NOME"].ToString();
                    dtpNascimento.Value = (DateTime) dr["DATA_NASCIMENTO"];
                    string sexo;
                    sexo = dr["SEXO"].ToString();
                    if (sexo == "f")
                        cbSexo.SelectedIndex = 0;
                    else
                        cbSexo.SelectedIndex = 1;
                    mtbCpf.Text = dr["CPF"].ToString();
                    tbEmail.Text = dr["EMAIL"].ToString();
                    mtbCep.Text = dr["CEP"].ToString();
                    tbEnd.Text = dr["LOGRADOURO"].ToString();
                    mtbNumero.Text = dr["NUMERO"].ToString();
                    tbComplemento.Text = dr["COMPLEMENTO"].ToString();
                    tbOcup.Text = dr["OCUPACAO"].ToString();
                    
                    // Puxa do DB e transforma o campo já mostrando a moeda
                    double amount = double.Parse(dr["RENDA"].ToString());
                    if (Double.TryParse(dr["RENDA"].ToString(), NumberStyles.Currency, null, out amount))
                    {
                        tbRenda.Text = amount.ToString("C");
                    }

                    // Salva cod endereço em uma variável
                    editacodend = dr["COD_ENDERECO"].ToString();
                
                    // Marca ou desmarca a opção checkbox para cliente especial
                    string flag_especial;
                    flag_especial = dr["FLAG_ESPECIAL"].ToString();
                    if (flag_especial == "s")
                        cbEspecial.Checked = true;
                    else
                        cbEspecial.Checked = false;

                    // Marca ou desmarca a opção checkbox se o cliente deseja receber marketing
                    string flag_marketing;
                    flag_marketing = dr["FLAG_MARKETING"].ToString();
                    if (flag_marketing == "s")
                        cbMarketing.Checked = true;
                    else
                        cbMarketing.Checked = false;
                    
                    // Seleciona o UF e simula um evento de seleção
                    cbUf.SelectedItem = dr["UF"];
                    cbUf_SelectionChangeCommitted(new Object(), new EventArgs());
                    cbCidade.SelectedValue = dr["COD_CIDADE"];
                }
                else
                {
                    MessageBox.Show("Erro - Edição2?");
                    this.Close();
                }
            }
        }

        private void cbUf_SelectionChangeCommitted(object sender, EventArgs e)
        {
            // Verifica o UF no BD e popula o campo de cidades
            comando = new OleDbCommand(sqlConsultaCidadesDoUf, conexao);

            OleDbParameter pUF = new OleDbParameter("uf", OleDbType.VarChar);
            pUF.Value = cbUf.SelectedItem;
            comando.Parameters.Add(pUF);

            // Select
            drCidade = comando.ExecuteReader();
            cbCidade.ValueMember = "codCidade";
            cbCidade.DisplayMember = "nomeCidade";

            // Popula a combo de cidades de acordo com o uf selecionado  
            if (drCidade.HasRows)
            {
                ArrayList cidades = new ArrayList();
                while (drCidade.Read())
                {
                    cidades.Add(new
                    {
                        codCidade = drCidade["cod_cidade"],
                        nomeCidade = drCidade["nome"]
                    });
                }
                cbCidade.DataSource = cidades;
            }
            else
            {
                cbCidade.DataSource = null;
            }


        }

        private void btSalvar_Click(object sender, EventArgs e)
        {
            // Se o método booleando de validação está OK = True;
            if (valida())
            {
                // Se esta em modo de edição
                if (edicao)
                    {
                        // Comando de update de PESSOA
                        comando = new OleDbCommand(sqlUpdatePessoa, conexao);

                        pNomepessoa = new OleDbParameter("NOME", OleDbType.VarChar);
                        pNomepessoa.Value = tbNome.Text.Trim();
                        comando.Parameters.Add(pNomepessoa);

                        // Verifica opção selecionada e atribui para char do BD
                        string sexo;
                        if (cbSexo.SelectedItem.ToString() == "Masculino")
                            sexo = "m";
                        else
                            sexo = "f";

                        pSexo = new OleDbParameter("SEXO", OleDbType.Char);
                        pSexo.Value = sexo;
                        comando.Parameters.Add(pSexo);

                        pCpf = new OleDbParameter("CPF", OleDbType.VarChar);
                        pCpf.Value = mtbCpf.Text;
                        comando.Parameters.Add(pCpf);

                        pData_Nascimento = new OleDbParameter("DATA_NASCIMENTO", OleDbType.Date);
                        pData_Nascimento.Value = dtpNascimento.Value.ToShortDateString();
                        comando.Parameters.Add(pData_Nascimento);

                        pEmail = new OleDbParameter("EMAIL", OleDbType.VarChar);
                        pEmail.Value = tbEmail.Text.Trim();
                        comando.Parameters.Add(pEmail);

                        pCod_pessoa = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                        pCod_pessoa.Value = codCliente;
                        comando.Parameters.Add(pCod_pessoa);

                        // Atualiza
                        comando.ExecuteNonQuery();

                        // Comando de update de Endereço
                        comando = new OleDbCommand(sqlUpdateEndereco, conexao);

                        pLogradouro = new OleDbParameter("LOGRADOURO", OleDbType.VarChar);
                        pLogradouro.Value = tbEnd.Text.Trim();
                        comando.Parameters.Add(pLogradouro);

                        pNumero = new OleDbParameter("NUMERO", OleDbType.Numeric);
                        pNumero.Value = mtbNumero.Text.Trim();
                        comando.Parameters.Add(pNumero);

                        pCep = new OleDbParameter("CEP", OleDbType.VarChar);
                        pCep.Value = mtbCep.Text;
                        comando.Parameters.Add(pCep);

                        pCod_cidade = new OleDbParameter("COD_CIDADE", OleDbType.VarChar);
                        pCod_cidade.Value = cbCidade.SelectedValue;
                        comando.Parameters.Add(pCod_cidade);

                        pComplemento = new OleDbParameter("COMPLEMENTO", OleDbType.VarChar);
                        pComplemento.Value = tbComplemento.Text.Trim();
                        comando.Parameters.Add(pComplemento);

                        pCod_endereco = new OleDbParameter("COD_ENDERECO", OleDbType.Integer);
                        pCod_endereco.Value = editacodend;
                        comando.Parameters.Add(pCod_endereco);
                        
                        // Atualiza
                        comando.ExecuteNonQuery();

                        // Comando de update de Cliente
                        comando = new OleDbCommand(sqlUpdateCliente, conexao);

                        pOcupacao = new OleDbParameter("OCUPACAO", OleDbType.VarChar);
                        pOcupacao.Value = tbOcup.Text;
                        comando.Parameters.Add(pOcupacao);

                        string receberenda = tbRenda.Text;

                        pRenda = new OleDbParameter("RENDA", OleDbType.Numeric);
                        pRenda.Value = receberenda.Substring(3); ;
                        comando.Parameters.Add(pRenda);

                        // Checa se o cliente é especial
                        if (cbEspecial.Checked)
                            flagEspecial = 's';
                        else
                            flagEspecial = 'n';

                        pFlag_especial = new OleDbParameter("FLAG_ESPECIAL", OleDbType.Char);
                        pFlag_especial.Value = flagEspecial;
                        comando.Parameters.Add(pFlag_especial);

                        // Checa se o cliente deseja receber marketing
                        if (cbMarketing.Checked)
                            flagMarketing = 's';
                        else
                            flagMarketing = 'n';

                        pFlag_marketing = new OleDbParameter("FLAG_MARKETING", OleDbType.Char);
                        pFlag_marketing.Value = flagMarketing;
                        comando.Parameters.Add(pFlag_marketing);

                        pCod_pessoaCliente = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                        pCod_pessoaCliente.Value = codCliente;
                        comando.Parameters.Add(pCod_pessoaCliente);

                        // Atualiza
                        comando.ExecuteNonQuery();

                        // Comando de atualização de Telefone Residencial
                        if (mtbTelres.Text != telRes)
                        {
                            if (mtbTelres.MaskCompleted)
                            {
                                if (bTelRes == true) 
                                {
                                    comando = new OleDbCommand(sqlInsereTel, conexao);

                                    pNumerotel = new OleDbParameter("NUMERO", OleDbType.Numeric);
                                    pNumerotel.Value = mtbTelres.Text;
                                    comando.Parameters.Add(pNumerotel);

                                    pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                                    pTipoTel.Value = 1;
                                    comando.Parameters.Add(pTipoTel);

                                    pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                    pCod_pessoafktel.Value = codCliente;
                                    comando.Parameters.Add(pCod_pessoafktel);

                                }
                                else
                                {
                                    comando = new OleDbCommand(sqlUpdateTel, conexao);

                                    pNumerotel = new OleDbParameter("NUMERO", OleDbType.Numeric);
                                    pNumerotel.Value = mtbTelres.Text;
                                    comando.Parameters.Add(pNumerotel);

                                    pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                                    pTipoTel.Value = 1;
                                    comando.Parameters.Add(pTipoTel);

                                    pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                    pCod_pessoafktel.Value = codCliente;
                                    comando.Parameters.Add(pCod_pessoafktel);

                                }
                            }
                            else {

                                comando = new OleDbCommand("delete from telefone where tipo = 1 and cod_pessoa = ?", conexao);

                                pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                pCod_pessoafktel.Value = codCliente;
                                comando.Parameters.Add(pCod_pessoafktel);
                            }
                        }
                        // Realiza o comando de acordo com o objetivo seja ele alterar, inserir ou excluir
                        comando.ExecuteNonQuery();

                        // Comando de atualização de Telefone Comercial
                        if (mtbTelcom.Text != telCom)
                        {
                            if (mtbTelcom.MaskCompleted)
                            {
                                if (bTelCom == true)
                                {
                                    comando = new OleDbCommand(sqlInsereTel, conexao);

                                    pNumerotel = new OleDbParameter("NUMERO", OleDbType.Numeric);
                                    pNumerotel.Value = mtbTelcom.Text;
                                    comando.Parameters.Add(pNumerotel);

                                    pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                                    pTipoTel.Value = 2;
                                    comando.Parameters.Add(pTipoTel);

                                    pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                    pCod_pessoafktel.Value = codCliente;
                                    comando.Parameters.Add(pCod_pessoafktel);
                                }
                                else
                                {
                                    comando = new OleDbCommand(sqlUpdateTel, conexao);

                                    pNumeroCom = new OleDbParameter("NUMERO", OleDbType.Numeric);
                                    pNumeroCom.Value = mtbTelcom.Text;
                                    comando.Parameters.Add(pNumeroCom);

                                    pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                                    pTipoTel.Value = 2;
                                    comando.Parameters.Add(pTipoTel);

                                    pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                    pCod_pessoafktel.Value = codCliente;
                                    comando.Parameters.Add(pCod_pessoafktel);
                                }
                            }
                            else
                            {
                                comando = new OleDbCommand("delete from telefone where tipo = 2 and cod_pessoa = ?", conexao);

                                pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                pCod_pessoafktel.Value = codCliente;
                                comando.Parameters.Add(pCod_pessoafktel);
                            }
                        }
                        // Realiza o comando de acordo com o objetivo seja ele alterar, inserir ou excluir
                        comando.ExecuteNonQuery();

                        // Comando de atualização de Telefone Celular
                        if (mtbTelcel.Text != telCel)
                        {
                            if (mtbTelcel.MaskCompleted)
                            {
                                if (bTelCel == true)
                                {
                                    comando = new OleDbCommand(sqlInsereTel, conexao);

                                    pNumerotel = new OleDbParameter("NUMERO", OleDbType.Numeric);
                                    pNumerotel.Value = mtbTelcel.Text;
                                    comando.Parameters.Add(pNumerotel);

                                    pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                                    pTipoTel.Value = 3;
                                    comando.Parameters.Add(pTipoTel);

                                    pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                    pCod_pessoafktel.Value = codCliente;
                                    comando.Parameters.Add(pCod_pessoafktel);
                                }
                                else
                                {
                                    comando = new OleDbCommand(sqlUpdateTel, conexao);

                                    pNumeroCel = new OleDbParameter("NUMERO", OleDbType.Numeric);
                                    pNumeroCel.Value = mtbTelcel.Text;
                                    comando.Parameters.Add(pNumeroCel);

                                    pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                                    pTipoTel.Value = 3;
                                    comando.Parameters.Add(pTipoTel);

                                    pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                    pCod_pessoafktel.Value = codCliente;
                                    comando.Parameters.Add(pCod_pessoafktel);
                                }
                            }
                            else
                            {
                                comando = new OleDbCommand("delete from telefone where tipo = 3 and cod_pessoa = ?", conexao);

                                pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                                pCod_pessoafktel.Value = codCliente;
                                comando.Parameters.Add(pCod_pessoafktel);
                            }
                        }
                        // Realiza o comando de acordo com o objetivo seja ele alterar, inserir ou excluir
                        comando.ExecuteNonQuery();
                            
                        this.Close();
                    }
                    else
                    {
                        // Entra para inserção de novos dados    
                    
                        // Chama método de código da chave primária do endereço
                        PegaProximoCodEndereco();

                        // Comando de inserção de endereço
                        comando = new OleDbCommand(sqlInsereend, conexao);

                        pCod_endereco = new OleDbParameter("COD_ENDERECO", OleDbType.Integer);
                        pCod_endereco.Value = codProximoEndereco;
                        comando.Parameters.Add(pCod_endereco);

                        pLogradouro = new OleDbParameter("LOGRADOURO", OleDbType.VarChar);
                        pLogradouro.Value = tbEnd.Text.Trim();
                        comando.Parameters.Add(pLogradouro);

                        pNumero = new OleDbParameter("NUMERO", OleDbType.Numeric);
                        pNumero.Value = mtbNumero.Text.Trim();
                        comando.Parameters.Add(pNumero);

                        pCep = new OleDbParameter("CEP", OleDbType.VarChar);
                        pCep.Value = mtbCep.Text;
                        comando.Parameters.Add(pCep);

                        pCod_cidade = new OleDbParameter("COD_CIDADE", OleDbType.VarChar);
                        pCod_cidade.Value = cbCidade.SelectedValue;
                        comando.Parameters.Add(pCod_cidade);

                        pComplemento = new OleDbParameter("COMPLEMENTO", OleDbType.VarChar);
                        pComplemento.Value = tbComplemento.Text.Trim();
                        comando.Parameters.Add(pComplemento);

                        // Insere
                        comando.ExecuteNonQuery();

                        // Chama método de código da chave primária da pessoa
                        PegaProximoCodPessoa();

                        // Comando de inserção de ´pessoa
                        comando = new OleDbCommand(sqlInserepessoa, conexao);

                        pCod_pessoa = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                        pCod_pessoa.Value = codProximaPessoa;
                        comando.Parameters.Add(pCod_pessoa);

                        pNomepessoa = new OleDbParameter("NOME", OleDbType.VarChar);
                        pNomepessoa.Value = tbNome.Text.Trim();
                        comando.Parameters.Add(pNomepessoa);

                        pTipo = new OleDbParameter("TIPO", OleDbType.VarChar);
                        pTipo.Value = 1;
                        comando.Parameters.Add(pTipo);

                        // Verifica opção selecionada e atribui para char do BD
                        string sexo;
                        if (cbSexo.SelectedItem.ToString() == "Masculino")
                            sexo = "m";
                        else
                            sexo = "f";

                        pSexo = new OleDbParameter("SEXO", OleDbType.Char);
                        pSexo.Value = sexo;
                        comando.Parameters.Add(pSexo);

                        pCpf = new OleDbParameter("CPF", OleDbType.VarChar);
                        pCpf.Value = mtbCpf.Text;
                        comando.Parameters.Add(pCpf);

                        pData_Nascimento = new OleDbParameter("DATA_NASCIMENTO", OleDbType.Date);
                        pData_Nascimento.Value = dtpNascimento.Value.ToShortDateString();
                        comando.Parameters.Add(pData_Nascimento);

                        pEmail = new OleDbParameter("EMAIL", OleDbType.VarChar);
                        pEmail.Value = tbEmail.Text.Trim();
                        comando.Parameters.Add(pEmail);

                        pCod_enderecofk = new OleDbParameter("COD_ENDERECO", OleDbType.Integer);
                        pCod_enderecofk.Value = codProximoEndereco;
                        comando.Parameters.Add(pCod_enderecofk);

                        // Insere
                        comando.ExecuteNonQuery();

                        // Comando de inserção de Telefones

                        if (mtbTelres.MaskCompleted)
                        {
                            comando = new OleDbCommand(sqlInsereTel, conexao);

                            pNumerotel = new OleDbParameter("NUMERO", OleDbType.Numeric);
                            pNumerotel.Value = mtbTelres.Text;
                            comando.Parameters.Add(pNumerotel);

                            pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                            pTipoTel.Value = 1;
                            comando.Parameters.Add(pTipoTel);

                            pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                            pCod_pessoafktel.Value = codProximaPessoa;
                            comando.Parameters.Add(pCod_pessoafktel);

                            // Insere
                            comando.ExecuteNonQuery();
                        }

                        if (mtbTelcom.MaskCompleted)
                        {
                            comando = new OleDbCommand(sqlInsereTel, conexao);

                            pNumeroCom = new OleDbParameter("NUMERO", OleDbType.Numeric);
                            pNumeroCom.Value = mtbTelcom.Text;
                            comando.Parameters.Add(pNumeroCom);

                            pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                            pTipoTel.Value = 2;
                            comando.Parameters.Add(pTipoTel);

                            pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                            pCod_pessoafktel.Value = codProximaPessoa;
                            comando.Parameters.Add(pCod_pessoafktel);

                            // Insere
                            comando.ExecuteNonQuery();
                        }

                        if (mtbTelcel.MaskCompleted)
                        {
                            comando = new OleDbCommand(sqlInsereTel, conexao);

                            pNumeroCel = new OleDbParameter("NUMERO", OleDbType.Numeric);
                            pNumeroCel.Value = mtbTelcel.Text;
                            comando.Parameters.Add(pNumeroCel);

                            pTipoTel = new OleDbParameter("TIPO", OleDbType.Integer);
                            pTipoTel.Value = 3;
                            comando.Parameters.Add(pTipoTel);

                            pCod_pessoafktel = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                            pCod_pessoafktel.Value = codProximaPessoa;
                            comando.Parameters.Add(pCod_pessoafktel);

                            // Insere
                            comando.ExecuteNonQuery();
                        }

                        // Comando de inserção de Cliente
                        comando = new OleDbCommand(sqlInsereCliente, conexao);

                        pCod_pessoaCliente = new OleDbParameter("COD_PESSOA", OleDbType.Integer);
                        pCod_pessoaCliente.Value = codProximaPessoa;
                        comando.Parameters.Add(pCod_pessoaCliente);

                        pOcupacao = new OleDbParameter("OCUPACAO", OleDbType.VarChar);
                        pOcupacao.Value = tbOcup.Text;
                        comando.Parameters.Add(pOcupacao);

                        // String Recebe a renda porém com "R$" é necessário retirar com substring.
                        string receberenda = tbRenda.Text;
                        pRenda = new OleDbParameter("RENDA", OleDbType.Numeric);
                        pRenda.Value = receberenda.Substring(3);
                        comando.Parameters.Add(pRenda);

                        if (cbEspecial.Checked)
                            flagEspecial = 's';
                        else
                            flagEspecial = 'n';

                        pFlag_especial = new OleDbParameter("FLAG_ESPECIAL", OleDbType.Char);
                        pFlag_especial.Value = flagEspecial;
                        comando.Parameters.Add(pFlag_especial);

                        // Checa se o cliente deseja receber marketing
                        if (cbMarketing.Checked)
                            flagMarketing = 's';
                        else
                            flagMarketing = 'n';

                        pFlag_marketing = new OleDbParameter("FLAG_MARKETING", OleDbType.Char);
                        pFlag_marketing.Value = flagMarketing;
                        comando.Parameters.Add(pFlag_marketing);

                        // Insere
                        comando.ExecuteNonQuery();

                        DialogResult resultado = MessageBox.Show(this, "Cadastrado com sucesso.\nDeseja cadastrar outro registro?", "Cadastro", MessageBoxButtons.YesNo);

                        if (resultado == DialogResult.Yes)
                        {
                            // Limpa os campos
                            tbEmail.Clear();
                            tbComplemento.Clear();
                            tbEnd.Clear();
                            tbNome.Clear();
                            mtbNumero.Clear();
                            tbOcup.Clear();
                            tbRenda.Clear();
                            mtbCep.Clear();
                            mtbCpf.Clear();
                            dtpNascimento.Value = new DateTime(1997, 01, 01);
                            mtbTelcom.Clear();
                            mtbTelres.Clear();
                            mtbTelcel.Clear();
                            cbCidade.SelectedIndex = -1;
                            cbUf.SelectedIndex = -1;
                            cbSexo.SelectedIndex = -1;
                            cbEspecial.Checked = false;
                            cbMarketing.Checked = true;
                        }
                        else
                        {
                            this.Close();
                        }
                    }
            }
        }
        
        private void PegaProximoCodEndereco() // Método para adquirir e segurar o próximo código de endereço da chave primária.
         {
             comando = new OleDbCommand(sqlConsultacod_end, conexao);
             dr = comando.ExecuteReader();

             if (dr.Read())
             {
                 codProximoEndereco = Convert.ToInt32(dr["NEXTVAL"]);
             }
             else
             {
                 MessageBox.Show("Erro - Edição?");
                 this.Close();
             }
         }

        private void PegaProximoCodPessoa() // Método para adquirir e segurar o próximo código de endereço da chave primária.
        {
            comando = new OleDbCommand(sqlConsultacod_pessoa, conexao);
            dr = comando.ExecuteReader();

            if (dr.Read())
            {
                codProximaPessoa = Convert.ToInt32(dr["NEXTVAL"]);
            }
            else
            {
                MessageBox.Show("Erro - Edição?");
                this.Close();
            }
        }

        private bool valida() //Método booleando para validação de todos os campos
        {
            // Nome
            if (tbNome.TextLength < 5)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbNome.Focus();
                tbNome.BackColor = Color.Tomato;
                return false;
            }
            else
                tbNome.BackColor = Color.White;

            //Data de Nascimento
            if (dtpNascimento.Value >= DateTime.Now)
            {
                MessageBox.Show(this, "Digite uma data válida.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                dtpNascimento.Focus();
                return false;
            }

            // Combo Box Sexo
            if (cbSexo.SelectedIndex < 0)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                cbSexo.Focus();
                cbSexo.BackColor = Color.Tomato;
                return false;
            }
            else
                cbSexo.BackColor = Color.White;

            // CPF
            if (!mtbCpf.MaskFull)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                mtbCpf.Focus();
                mtbCpf.BackColor = Color.Tomato;
                return false;
            }
            else
                mtbCpf.BackColor = Color.White;

            if (!validaCPF(mtbCpf.Text))
            {
                MessageBox.Show(this, "Preencha um CPF válido.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                mtbCpf.Focus();
                mtbCpf.BackColor = Color.Tomato;
                return false;
            }
            else
                mtbCpf.BackColor = Color.White;

           

            // Email
            if (tbEmail.TextLength < 5)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbEmail.Focus();
                tbEmail.BackColor = Color.Tomato;
                return false;
            }
            else
                tbEmail.BackColor = Color.White;


            String email = tbEmail.Text;
            try
            {
                MailAddress m = new MailAddress(email);
                tbEmail.BackColor = Color.White;
            }
            catch 
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbEmail.Focus();
                tbEmail.BackColor = Color.Tomato;
                return false;
            }

            // CEP
            if (!mtbCep.MaskFull)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                mtbCep.Focus();
                mtbCep.BackColor = Color.Tomato;
                return false;
            }
            else
                mtbCep.BackColor = Color.White;

            // Endereço
            if (tbEnd.TextLength < 5)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbEnd.Focus();
                tbEnd.BackColor = Color.Tomato;
                return false;
            }
            else
                tbEnd.BackColor = Color.White;

            // Numero do Endereço
            if (mtbNumero.Text.Length < 1)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                mtbNumero.Focus();
                mtbNumero.BackColor = Color.Tomato;
                return false;
            }
            else
                mtbNumero.BackColor = Color.White;

            // Combo box UF
            if (cbUf.SelectedIndex < 0)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                cbUf.Focus();
                cbUf.BackColor = Color.Tomato;
                return false;
            }
            else
                cbUf.BackColor = Color.White;

            // Combo box Cidade
            if (cbCidade.SelectedIndex < 0)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                cbCidade.Focus();
                cbCidade.BackColor = Color.Tomato;
                return false;
            }
            else
                cbCidade.BackColor = Color.White;

            // Ocupação
            if (tbOcup.TextLength < 3)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbOcup.Focus();
                tbOcup.BackColor = Color.Tomato;
                return false;
            }
            else
                tbOcup.BackColor = Color.White;

            // Renda
            if (tbRenda.Text.Length < 7)
            {
                MessageBox.Show(this, "Preencha os campos corretamente.", "Validação", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                tbRenda.Focus();
                tbRenda.BackColor = Color.Tomato;
                return false;
            }
            else
                tbRenda.BackColor = Color.White;

            // Telefones
            if (!mtbTelres.MaskFull && !mtbTelcel.MaskFull && !mtbTelcom.MaskFull)
            {
                MessageBox.Show(this, "Digite pelo menos um número de contato", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return false;
            }

            return true;
        }

        private void textBox1_Leave(object sender, EventArgs e) 
        {
            // Evento para automaticamente ser inserido a MOEDA (R$) após sair do textbox. Necessário SYSTEM.GLOBALIZATION
            double amount = 0.0d;
            if (Double.TryParse(tbRenda.Text, NumberStyles.Currency, null, out amount))
            {
                tbRenda.Text = amount.ToString("C");
            }
        }

        private void btAdicionarCidade_Click(object sender, EventArgs e)
        {
            //Adiciona uma nova cidade se não existir
            FrmCadastroCidade frmCadastro = new FrmCadastroCidade();
            frmCadastro.Text = "Cadastro de cidade";
            frmCadastro.ShowDialog();
        }

        private void FrmCadastroCliente_FormClosed(object sender, FormClosedEventArgs e)
        {
            conexao.Close();
        }

        public bool validaCPF(string cpf)
        {

            int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };

            int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };

            string tempCpf;

            string digito;

            int soma;

            int resto;

            cpf = cpf.Trim();

            cpf = cpf.Replace(".", "").Replace("-", "");

            if (cpf.Length != 11)
                return false;

            tempCpf = cpf.Substring(0, 9);

            soma = 0;

            for (int i = 0; i < 9; i++)

                soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];

            resto = soma % 11;

            if (resto < 2)
                resto = 0;

            else
                resto = 11 - resto;

            digito = resto.ToString();

            tempCpf = tempCpf + digito;

            soma = 0;

            for (int i = 0; i < 10; i++)
                soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];

            resto = soma % 11;

            if (resto < 2)
                resto = 0;

            else
                resto = 11 - resto;

            digito = digito + resto.ToString();

            return cpf.EndsWith(digito);

        }

        private void tbRenda_KeyPress(object sender, KeyPressEventArgs e)
        {
            char ch = e.KeyChar;

            // Se o caractere a ser inserido é uma virgula (46 na tabela ascii)
            // e se a vírgula já existir a vírgula no texto
            // finaliza o evento sem inserir o novo caractere
            if (ch == 44 && tbRenda.Text.IndexOf(',') != -1)
            {
                e.Handled = true;
                return;
            }

            // Se o caractere a ser inserido não for um digito, não for uma vírgula e não for o backspace
            // finaliza o evento sem inserir
            if (!Char.IsDigit(ch) && ch != 8 && ch != 44)
            {
                e.Handled = true;
            }

            if (e.KeyChar == 13)
            {
                btSalvar_Click(sender, e);
            }
        }

        private void FrmCadastroCliente_KeyDown(object sender, KeyEventArgs e)
        {
            //Hotkey para salvar os dados
            if (e.KeyData == (Keys.Control | Keys.S))
            {
                btSalvar_Click(sender, e);
            }

            //Hotkey para a tecla ESC fechar a janela
            if (e.KeyData == (Keys.Escape))
            {
                this.Close();
            }
        }


    }
}
